﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Toto.Componentes
{
    class Bola
    {
        float raio;
        public float speed { get; set; }
        private float accel;
        public Vector2 Direction;
        public Texture2D imagem;
        public Vector2 position;
        public Vector2 velocidade;
        public Rectangle campo;
        Random rnd = new Random(DateTime.Now.Millisecond);
        public int randomico;
        public int direction;
        public int direction2;
        //SoundEffect efeito;

        public Rectangle retangulo;

        public Rectangle hitBox;

        public int PontoTimeA = 144;
        public int PontoTimeB = 144;

        public Bola(Rectangle campo, Rectangle retangulo)
        {
            this.imagem = Textura.texturaBola;
            this.raio = imagem.Width / 2;
            accel = -15.0f;
            speed = 250.0f;
            this.campo = campo;
            this.retangulo = retangulo;
            this.Direction = new Vector2(-1, 0);
            position = new Vector2(campo.Width / 2 + imagem.Height * 4/5 , campo.Y + campo.Height / 2 - imagem.Height / 2);
            //Randomização da saida da bola pra qualquer das 4 diagonais
            randomico = rnd.Next(100);
            if (randomico > 50) {  direction = -1; }
            else  {  direction = +1;   }
            randomico = rnd.Next(100);
            if (randomico > 50) { direction2 = -1; }
            else { direction2 = +1; }
            Direction = new Vector2 (direction * 5, direction2 * 5);
            hitBox.Width = retangulo.Width;
            hitBox.Height = retangulo.Height;

        }

        public void Update(GameTime gameTime)
        {           
            float time = (float)(gameTime.ElapsedGameTime.TotalMilliseconds / 2000.0f);
            // Atualiza a posição da bola
            // S = So + vo * t + (a * t * t) / 2

            while (speed > 400)
            {
                speed = speed - 1;

            }
            if (speed > 0)
            {
                position.X += Direction.X * (speed * time) + ((accel * (float)Math.Pow(time, 2)) * 0.5f);
                position.Y += Direction.Y * (speed * time) + ((accel * (float)Math.Pow(time, 2)) * 0.5f);
                // Atualiza velocidade do objeto
                // v = vo + a * t
                speed += accel * time;
                if (retangulo.X < 128)
                {
                    retangulo.X += 32;
                }
                else
                {
                    retangulo.X = 0;
                }
            }
            else
            {
                speed = 0.0f;
            }

            //atualiza a posicao do retangulo da bola de acordo com  a sua posicao 
            this.hitBox.X = (int)position.X;
            this.hitBox.Y = (int)position.Y;
                                 
            #region Manter na Janela

            if (position.Y <= campo.Y)
            {
                position.Y = campo.Y;
                Direction.Y = Math.Abs(Direction.Y) - 1;
            }
            if (position.Y >= (campo.Y + campo.Height - retangulo.Height) )
            {
                position.Y = (campo.Y + campo.Height - retangulo.Height);
                Direction.Y = -Math.Abs(Direction.Y) + 1;
            }
            if (position.X <= campo.X)
            {
                //metade da bola pra dentro = gol
                if ((position.Y > campo.Y + 170 - imagem.Height / 2) && (position.Y < campo.Y + 330 - imagem.Height / 2))
                {
                    Console.WriteLine("GOLLLLLLLLLLLLLLLLLL do time Verde");
                    PontoTimeB = PontoTimeB - 16;
                    if (PontoTimeB == -16)
                    {
                        PontoTimeB = 144;
                    }
                    position = new Vector2(campo.Width / 2 - imagem.Height / 2 + campo.X, campo.Y + campo.Height / 2 - imagem.Height / 2);
                    if (randomico > 50) { direction = -1; }
                    else { direction = +1; }
                    randomico = rnd.Next(100);
                    if (randomico > 50) { direction2 = -1; }
                    else { direction2 = +1; }
                    speed = 150.0f;
                    Direction = new Vector2(direction * 5, direction2 * 5);
                }
                else //se a bola não entrar no gol rebate pra direita
                {
                    Direction.X = (Math.Abs(Direction.X) + 1);
                }
            }
            if (position.X >= (campo.X + campo.Width - retangulo.Width))
            {
                if ((position.Y > campo.Y + 170 - imagem.Height / 2) && (position.Y < campo.Y + 330 - imagem.Height / 2))
                {
                    Console.WriteLine("GOLLLLLLLLLLLLLLLLLL do time Azul");
                    PontoTimeA = PontoTimeA - 16;
                    if (PontoTimeA == -16)
                    {
                        PontoTimeA = 144;
                    }
                    position = new Vector2(campo.Width / 2 - imagem.Height / 2 + campo.X / 6, campo.Y + campo.Height / 2 - imagem.Height / 2);
                    if (randomico > 50) { direction = -1; }
                    else { direction = +1; }
                    randomico = rnd.Next(100);
                    if (randomico > 50) { direction2 = -1; }
                    else { direction2 = +1; }
                    speed = 150.0f;
                    Direction = new Vector2(direction * 5, direction2 * 5);
                }
                else //se a bola não entrar no gol rebate pra esquerda
                {
                    Direction.X = (-Math.Abs(Direction.X) + 1);
                }
            }
            
            #endregion
            
        }


        /// <summary>
        /// Cria um rectangulo entorno da bola
        /// para poder detectar a colisão com outro objeto
        /// </summary>
        /// <returns></returns>
        public BoundingBox GetBounding()
        {
            return new BoundingBox(new Vector3(this.position.X, this.position.Y, 0), new Vector3(this.position.X + this.hitBox.Width, this.position.Y + this.hitBox.Height, 0));
        }

        public void Draw(SpriteBatch spriteBatch, GameTime gameTime)
        {
            spriteBatch.Draw(imagem, position, retangulo, Color.White);            
        }

    }


}
